package us.proyecto.canarios.dao;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Begin;
import org.jboss.seam.annotations.FlushModeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;

import us.proyecto.canarios.domain.Asociacion;
import us.proyecto.canarios.domain.Concurso;
import us.proyecto.canarios.domain.Criador;
import us.proyecto.canarios.domain.Juez;
import us.proyecto.canarios.domain.Puntuacion;
import us.proyecto.canarios.domain.Usuario;

@Name("concursoDAO")
@Scope(ScopeType.SESSION)
public class ConcursoDAO {

    @In
    EntityManager em;

    public ConcursoDAO() {

    }


    public Integer obtieneNumJaula(Concurso c){
    	List lista = em.createQuery("select max(numJaula) from Puntuacion where concurso.idConcurso = " + c.getIdConcurso()).getResultList();
    	if(lista.size() >0){
    		Integer i = (Integer) lista.get(0);
    		if (i != null){
    		i = new Integer(i.intValue()+1);
    		}else{
    		    i = 1;
    		}
    		return i;
    	}else{
    		return new Integer(1);
    	}
    }

    public List<Concurso> getListByWhere(String where){
    	 return em.createQuery("from Concurso c where "+ where).getResultList();
    }
    @Begin(join = true, flushMode = FlushModeType.MANUAL)
    public boolean delete(Concurso usu) {
        boolean correcto;

        try {
            Concurso objDel= em.getReference(Concurso.class, usu.getIdConcurso());
            em.remove(objDel);
            em.flush();
            correcto = true;
        } catch (RuntimeException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            correcto = false;
        }
        return correcto;

    }
    @Begin(join = true, flushMode = FlushModeType.MANUAL)
    public boolean save(Concurso usu) {
        boolean correcto;

        try {
            em.persist(usu);
            em.flush();
            correcto = true;
        } catch (RuntimeException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            correcto = false;
        }
        return correcto;

    }

    @Begin(join = true, flushMode = FlushModeType.MANUAL)
    public boolean update(Concurso usu) {
        boolean correcto;

        try {
            em.merge(usu);
            em.flush();
            correcto = true;
        } catch (RuntimeException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            correcto = false;
        }
        return correcto;

    }

    public List<Criador> getListaCriadoresXConcurso(Concurso c){
    	List<Puntuacion> listaP =em.createQuery("select p from Puntuacion p left join fetch p.pajaro paj left join fetch paj.criador c where p.concurso.idConcurso =" + c.getIdConcurso()).getResultList();
    	List<Criador> listaC = new ArrayList<Criador>();
    	for(Puntuacion p: listaP){
    		if(!listaC.contains(p.getPajaro().getCriador())){
    			listaC.add(p.getPajaro().getCriador());
    		}
    	}
    	return listaC;
    }
    public Concurso sincronize(Concurso con){
    	con = em.merge(con);
    	return con;
    }

}
